/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestores.iteracao.manipuladores.marcadagua;

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author root
 */
public class DrawableImage implements IDrawable {

    private Image i;
    private Posicao epos;
    private int scaledwidth;
    private int scaledheight;
    private int x;
    private int y;
    private final Float alpha;

    public DrawableImage(File f, Posicao pos, Float alpha, Float scale) {
        this.epos = pos;
        this.alpha = alpha;
        if (f.isFile() && f.canRead()) {
            try {
                BufferedImage temp = ImageIO.read(f);
                if (temp != null) {
                    int tw = Math.round(temp.getWidth() * scale);
                    int th = Math.round(temp.getHeight() * scale);

                    if (tw < 1) {
                        tw = 1;
                    }
                    if (th < 1) {
                        th = 1;
                    }

                    i = temp.getScaledInstance(tw, th, Image.SCALE_SMOOTH);
                    scaledwidth = Math.round(temp.getWidth() * scale);
                    scaledheight = Math.round(temp.getHeight() * scale);
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } else {
            i = null;
        }
    }

    public boolean valida() {
        return i != null;
    }

    private Point2D getPos(int imgwidth, int imgheight) {
        Point pos;
        int meio = (imgheight / 2) - (scaledheight / 2);
        int baixo = (imgheight - scaledheight);
        int cima = 0;
        int centro = (imgwidth / 2) - (scaledwidth / 2);
        int esquerda = 0;
        int direita = (imgwidth - scaledwidth);
        switch (epos) {
            case MEIOCENTRO:
                pos = new Point(centro, meio);
                break;
            case MEIOESQUERDA:
                pos = new Point(esquerda, meio);
                break;
            case MEIODIREITA:
                pos = new Point(direita, meio);
                break;
            case TOPOCENTRO:
                pos = new Point(centro, cima);
                break;
            case TOPOESQUERDA:
                pos = new Point(esquerda, cima);
                break;
            case TOPODIREITA:
                pos = new Point(direita, cima);
                break;
            case BAIXOCENTRO:
                pos = new Point(centro, baixo);
                break;
            case BAIXOESQUERDA:
                pos = new Point(esquerda, baixo);
                break;
            case BAIXODIREITA:
                pos = new Point(direita, baixo);
                break;
            default:
                pos = new Point(centro, meio);
                break;
        }
        return pos;
    }

    @Deprecated
    public void draw(Graphics2D g) {
        Point2D posicao = getPos(500, 500);
        x = (int) Math.round(posicao.getX());
        y = (int) Math.round(posicao.getY());
        g.drawImage(i, x, y, null);
    }

    public void draw(Graphics2D g, int imgwidth, int imgheight) {
        Point2D posicao = getPos(imgwidth, imgheight);
        x = (int) Math.round(posicao.getX());
        y = (int) Math.round(posicao.getY());
        Graphics2D gtemp = (Graphics2D) g.create();
        AlphaComposite a = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, this.alpha);
        gtemp.setComposite(a);
        gtemp.drawImage(i, x, y, null);
        gtemp.dispose();
    }
}
